#Boa:Dialog:Dialog1

import wx
import wx.grid
import consultasBD
import Mensaje
import sincronizar_tabla  
import utiles
from decimal import Decimal

def create(parent):
    return Dialog1(parent)

[wxID_DIALOG1, wxID_DIALOG1CANCELAR, wxID_DIALOG1GRID1, 
 wxID_DIALOG1STATICTEXT1, wxID_DIALOG1STATICTEXT2, wxID_DIALOG1STATICTEXT3, 
 wxID_DIALOG1VOLVER, 
] = [wx.NewId() for _init_ctrls in range(7)]

class Dialog1(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_DIALOG1, name='', parent=prnt,
              pos=wx.Point(134, 166), size=wx.Size(695, 361),
              style=wx.DEFAULT_DIALOG_STYLE, title='Devolucion de Prendas')
        self.SetClientSize(wx.Size(679, 325))

        self.grid1 = wx.grid.Grid(id=wxID_DIALOG1GRID1, name='grid1',
              parent=self, pos=wx.Point(16, 8), size=wx.Size(648, 248),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, self.OnDclickIzq)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK, self.OnDclickDer)

        self.Volver = wx.Button(id=wxID_DIALOG1VOLVER, label='Aceptar',
              name='Volver', parent=self, pos=wx.Point(496, 280),
              size=wx.Size(79, 23), style=0)
        self.Volver.Bind(wx.EVT_BUTTON, self.OnBotonAceptar,
              id=wxID_DIALOG1VOLVER)

        self.staticText1 = wx.StaticText(id=wxID_DIALOG1STATICTEXT1,
              label='2. Doble click Izquierdo para seleccionar. Otra vez para aumentar la cantidad',
              name='staticText1', parent=self, pos=wx.Point(18, 288),
              size=wx.Size(369, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_DIALOG1STATICTEXT2,
              label='3. Doble click Derecho para disminuir la cantidad',
              name='staticText2', parent=self, pos=wx.Point(18, 302),
              size=wx.Size(229, 13), style=0)

        self.staticText3 = wx.StaticText(id=wxID_DIALOG1STATICTEXT3,
              label='1. Mover el cursor a la fila deseada.', name='staticText3',
              parent=self, pos=wx.Point(18, 274), size=wx.Size(172, 13),
              style=0)

        self.cancelar = wx.Button(id=wxID_DIALOG1CANCELAR, label='Cancelar',
              name='cancelar', parent=self, pos=wx.Point(589, 280),
              size=wx.Size(75, 23), style=0)
        self.cancelar.Bind(wx.EVT_BUTTON, self.OnBotonCancelar,
              id=wxID_DIALOG1CANCELAR)

    def __init__(self, parent, idcliente, diasdevoluciones):
        self._init_ctrls(parent)
        self.padre = parent
        self.idcliente = idcliente
        self.diasdevoluciones = diasdevoluciones
        self.sucursal = self.padre.padre.sucursalNro
        self.aceptado = False
        self.lista = [] 
        self.datosAdicionales = {}
        self.devoluciones = []
        self.cargaGrilla()
       
    def cargaGrilla(self):
        fechaLimite = utiles.sumarDiasLaboralesAFecha(self.diasdevoluciones)
        sql = "SELECT v.idventa,v.nrofactura,vp.ptc,vp.descri,v.fecha,vp.preciolista,vp.descuento,vp.preciofinal,vp.cantidad,vp.devuelto,vp.talle,vp.color,v.totalfactura FROM ventas v, ventastieneproductos vp WHERE v.idcliente = '%s' AND v.idventa = vp.idticket AND vp.cantidad <> vp.devuelto AND v.fecha >= '%s' AND v.sucursal = '%s' AND v.idformaticket <> '999' AND v.totalfactura > 0 ORDER BY v.fecha,v.nrofactura" % (self.idcliente, fechaLimite, self.sucursal)
        #Por cada item de una factura se trae la siguiente informacion en un diccionario:
        #devuelve: idventa,nrofactura, ptc, descri, fecha, preciolista, descuento, preciofinal, cantidad, devuelto, talle, color, totalfactura
        resultados = consultasBD.ordenCrudaDict(sql)
        totalRegistros = len(resultados)

        columnas =['Nro\nFactura','Fecha','PTC','Descripcion','T.','C.','Precio\nLista','D %','Precio\nFinal','Dev.\nAnt.','Cant.','A\ndevolver']
        self.grid1.CreateGrid(totalRegistros, len(columnas))
        
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
            
        self.grid1.AutoSizeRow(0,True)
        self.grid1.DisableDragColSize()
        self.grid1.DisableDragRowSize()
        
        for i, r in enumerate(resultados):    
            if r["nrofactura"] != "" :
                self.grid1.SetCellValue(i, 0, str(r["nrofactura"])) 
                self.grid1.SetCellValue(i, 1, utiles.convertirFecha(r["fecha"]))
                self.grid1.SetCellValue(i, 2, str(r["ptc"]))
                self.grid1.SetCellValue(i, 3, str(r["descri"])) 
                self.grid1.SetCellValue(i, 4, str(r["talle"]))
                self.grid1.SetCellValue(i, 5, str(r["color"]))
                self.grid1.SetCellValue(i, 6, str("%.02f" % r["preciolista"]))
                if Decimal(r["descuento"]) != Decimal("0.00"):
                    self.grid1.SetCellValue(i, 7, str("%.02f" % r["descuento"]))
                self.grid1.SetCellValue(i, 8, str("%.02f" % r["preciofinal"]))
                self.grid1.SetCellValue(i, 9, str(r["devuelto"]))
                self.grid1.SetCellValue(i, 10, str(r["cantidad"]-r["devuelto"]))
                self.grid1.SetCellValue(i, 11, "0")
                self.datosAdicionales[i] = str(r["idventa"])

        #se ajustan las columnas al contenido que ocasione el mayor ancho de celda
        for col in xrange(len(columnas)):
            self.grid1.AutoSizeColumn(col,True)

        #se inhabilita la edicion de la grilla
        for x in xrange(totalRegistros):
            for i in xrange(len(columnas)):
                self.grid1.SetReadOnly(x,i,True)

        return True
        
    def OnDclickIzq(self, event):
        col = self.grid1.GetGridCursorCol()
        fila = self.grid1.GetGridCursorRow()
              
        cant = int(self.grid1.GetCellValue(fila, 10))
        cant_devolver = int(self.grid1.GetCellValue(fila, 11))
        if cant == cant_devolver:
            return
        
        if cant_devolver == 0:
            utiles.colorear_fila(self.grid1, fila, utiles.VERDE)
            self.lista.append(fila)
        
        self.grid1.SetCellValue(fila, 11, str(cant_devolver + 1))
        self.grid1.Refresh()        

    def OnDclickDer(self, event):        
        col = self.grid1.GetGridCursorCol()
        fila = self.grid1.GetGridCursorRow()
        
        cant_devolver = int(self.grid1.GetCellValue(fila, 11))

        if cant_devolver == 0:
            return
        
        if cant_devolver == 1:
            utiles.colorear_fila(self.grid1, fila, utiles.BLANCO)
            self.lista.remove(fila)
        
        self.grid1.SetCellValue(fila, 11, str(cant_devolver - 1))
        self.grid1.Refresh()        

    def getAceptado(self):
        return self.aceptado

    def getDevoluciones(self):
        return self.devoluciones

    def OnBotonCancelar(self, event):
        self.aceptado = False
        self.Close()  

    def OnBotonAceptar(self, event):
        if len(self.lista) == 0:
            self.Close()
        self.devoluciones = []
        for fila in self.lista:
            listaFacturas = {}
            #datos de la factura y sus items
            idventa = self.datosAdicionales[fila]
            nrofactura = str(self.grid1.GetCellValue(fila, 0))
            ptc = str(self.grid1.GetCellValue(fila, 2))
            idcliente = str(self.idcliente)
            
            sql = "SELECT descuento,fecha FROM ventas WHERE idventa = '%s'" % (idventa)
            resultados = consultasBD.ordenCrudaDict(sql)
            descuento = Decimal(str("%.02f" % resultados[0]["descuento"]))
            fecha = str(resultados[0]["fecha"])

            sql = "SELECT codsussan FROM producto_talle_color WHERE id = '%s'" % (ptc)
            resultados = consultasBD.ordenCrudaDict(sql)
            codigoSussan = resultados[0]["codsussan"]

            sql = "SELECT * FROM ventastieneproductos WHERE idticket = '%s' AND ptc = '%s'" % (idventa,ptc)
            resultados = consultasBD.ordenCrudaDict(sql)

            #armando el diccionario con la informacion de devolucion
            devolucionAnterior = Decimal(str("%.02f" % resultados[0]["devuelto"]))
            cantidadDevuelta = Decimal(self.grid1.GetCellValue(fila, 11))
            listaFacturas["devolucionactual"] = cantidadDevuelta
            listaFacturas["devolucionanterior"] = devolucionAnterior
            listaFacturas["preciofinal"] = Decimal(str("%.02f" % resultados[0]["preciofinal"]))

            descuento_item = Decimal(str("%.02f" % resultados[0]["descuento"]))
            if descuento != Decimal("0.00"):
                listaFacturas["descuento"] = descuento
            else:
                listaFacturas["descuento"] = descuento_item

            listaFacturas["preciolista"] = Decimal(str("%.02f" % resultados[0]["preciolista"]))
            listaFacturas["idformaticket"] = str(resultados[0]["idformaticket"])
            listaFacturas["talle"] = str(resultados[0]["talle"])
            listaFacturas["color"] = str(resultados[0]["color"])
            listaFacturas["descri"] = str(resultados[0]["descri"])
            listaFacturas["codigo"] = codigoSussan
            listaFacturas["ptc"] = ptc
            listaFacturas["idcliente"] = idcliente
            listaFacturas["fecha"] = fecha
            listaFacturas["nrofactura"] = nrofactura
            listaFacturas["idventa"] = idventa

            self.devoluciones.append(listaFacturas)
        print "DEVOLUCIONES:",self.devoluciones
        self.aceptado = True
        self.Close()
        
